from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client

# from django.conf import settings
from mall import settings
from django.utils.deconstruct import deconstructible


# @deconstructible
# class FastDFSStorage(Storage):
#
#     def __init__(self, path=None, ip=None):
#         if path is None:
#             path = settings.FDFS_CLIENT_CONF
#             self.path = path
#
#         if ip is None:
#             ip = settings.FDFS_URL
#             self.ip = ip
#
#     def _open(self, name, mode='rb'):
#         pass
#
#     def _save(self, name, content, max_length=None):
#
#         data = content.read()
#         client = Fdfs_client(self.path)
#         result = client.upload_by_buffer(data)
#
#         if result.get('Status') == 'Upload successed.':
#             return result.get('Remote file_id')
#
#         else:
#             return Exception('上传失败')
#
#     def exists(self, name):
#
#         return False
#
#     def url(self, name):
#
#         return self.ip + name



from fdfs_client.client import Fdfs_client
client = Fdfs_client('utils/fastdfs/client.conf')
client.upload_by_filename('/home/python/Desktop/image/01.jpg')
# {'Storage IP': '192.168.234.144', 'Group name': 'group1', 'Uploaded size': '631.00KB', 'Remote file_id': 'group1/M00/00/02/wKjqkFto-D2AM3d-AAnfN49EfRc382.jpg', 'Status': 'Upload successed.', 'Local file name': '/home/python/Desktop/image/01.jpg'}




#1.您的自定义存储系统必须是以下子类 django.core.files.storage.Storage：

#4.您的存储类必须是可解构的， 以便在迁移中的字段上使用时可以对其进行序列化。只
# 要您的字段具有可自行序列化的参数，就 可以使用
# django.utils.deconstruct.deconstructible类装饰器（这就是Django在FileSystemStorage上使用的

@deconstructible
class FastDFSStorage(Storage):

    #2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
    # 这意味着任何设置都应该来自django.conf.settings：
    def __init__(self,path=None,ip=None):

        if path is None:
            path = settings.FDFS_CLIENT_CONF
        self.config_path = path

        if ip is None:
            ip = settings.FDFS_URL
        self.ip = ip



    #3.您的存储类必须实现_open()和_save() 方法以及
    # 适用于您的存储类的任何其他方法

    # 打开图片,
    # 我们采用的是 FastDFS 来打开图片,FDFS是通过 http来打开图片的,
    # 所以这个方法我们可以 不用实现
    def _open(self, name, mode='rb'):
        pass

    # 保存
    # 必须自定义实现,因为我们是通过FDFS区实现上传的
    def _save(self, name, content, max_length=None):

        # name: 只是一个文件名,并不是一个路径
        # content: 是上传的内容,我们可以通过 content.read() 来获取文件的二进制数据

        # 1. 创建fastdfs的客户端,加载配置文件
        # client = Fdfs_client('utils/fastdfs/client.conf')
        client = Fdfs_client(self.config_path)
        #2. 上传文件
        file_data=content.read() #获取文件的二进制数据
        # buffer 上传二进制数据
        # 它会将上传结果返回回来
        result = client.upload_by_buffer(file_data)

        #3.判断上传的状态,如果上传成功 ,我们需要获取
        #{'Remote file_id': 'group1/M00/00/02/wKjlhVtnotmAInopAAUJgyD1NQ4381.jpg',
        #  'Group name': 'group1',
        # 'Uploaded size': '322.00KB',
        # 'Local file name': '/home/python/Desktop/images/1.jpg',
        # 'Status': 'Upload successed.',
        # 'Storage IP': '192.168.229.133'}

        # 可以根据 Status 来判断是否上传成功
        if result.get('Status') == 'Upload successed.':
            # 上传成功
            return result.get('Remote file_id')
        else:
            raise Exception('上传失败')


    # 判断文件 是否存在
    # 因为fastdfs 已经过了文件重名的处理,
    #所以你即便上传同一个文件多少次,都可以上传上去
    def exists(self, name):
        return False



    #获取图片的路径
    def url(self, name):
        # name 就是我们返回的 那个 Remote file_id
        #group1/M00/00/02/wKjlhVtng5aAVhflAAUJgyD1NQ4582.jpg
        # 获取图片路径的话,如果只返回 一个 remode file_id的话 我们需要人为的再添加 tracker的ip和port
        # 所以我们直接在这里 将图片的完整url 拼接好

        # return  'http://192.168.229.133:8888/' + name
        return self.ip + name
